package projet_coo;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JPanel;

public class Case extends JPanel implements MouseListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private boolean occupee;
	private int nbDegat;
	private final Color couleur;
    private boolean click;
    private static boolean clicked=false;
    public Piece P;
    public final int x,y;
    private static Case destination=null;
	private boolean deploiement = true;
	private Plateau plat;
	private boolean Mur;
    Case(Plateau plat,Color c, int x, int y, Piece P,boolean dep,int nbdegat){
		setOccupee(false);
		this.setnbDegat(nbdegat);
    	setBackground(c);
    	this.plat = plat;
    	//on affiche en rouge les cases qui sont dangeureuses
		if(this.getnbDegat()!= 0){
			setBackground(Color.DARK_GRAY);
		}
		if(this.isMur()){
			setBackground(Color.BLACK);
		}
		// setBackground affecte la couleur de fond
		// setPreferredSize et setSize permettent de fixer
		// les dimensions de la case
		setPreferredSize(new Dimension(50,50));
		
		setSize(getPreferredSize());
		// les �v�nements souris sur la case sont �cout�s par la case elle-m�me
		addMouseListener(this);	
		couleur=c;
		click=false;
		this.x=x;
		this.y=y;
		this.P=P;
		this.deploiement  = dep;
		this.occupee = false;
	}
    
    public void ResetColor(){
    	setBackground(couleur);
    }
    
 // lorsqu'on enclenche le clic sur la case
    public void mousePressed(MouseEvent e){
		click=true; // la case se souvient que la souris a cliqu� sur elle
		clicked=true; // on informe les autres cases que le clic est enclench�
		setBackground(Color.green);  // on change la couleur de la case
		
		destination=this; // on sauvegarde la r�f�rence de la case 
		if(this.P != null){
			majInfos();
		}
		//que la souris survole actuellement avec le clic enclench�
    }
    
    // �v�nement "sur clic" non utilis�
    public void mouseClicked(MouseEvent e){
     
    	
    }
    
    // lorsqu'on entre dans une case avec le clic enclench�
    public void mouseEntered(MouseEvent e){
    	
    	if(!click && clicked && getnbDegat() ==0 && !isMur() )
			setBackground(Color.cyan); // on change la couleur 
		if( clicked)  
			destination=this; // et on met � jour la destination
    }
    
    
    // �v�nement lorsqu'on rel�che le clic 
    // cet �v�nement est capt� par la case qui a subit le clic
    // c'est pourquoi on a besoin de la variable destination
    // elle permet de savoir o� est la souris lorsque le clic est rel�ch�
    public void mouseReleased(MouseEvent e){
		// on remet la couleur d'origine de la case
		ResetColor();
		click=false;
		clicked=false;
		if(destination != null && !destination.isMur()){
		    // on remet la couleur d'origine de la case destination
		    destination.ResetColor();
		    // si la case d'origine contient une pi�ce 
		    // on essaie de bouger cette pi�ce vers la case destination
		    // ce d�placement r�ussit si on respecte les contraintes
		    if(P!=null)
		    	P.moveTo(destination);
		}	
    }
    
    
    // �v�nement sur sortie de la souris d'une case
    public void mouseExited(MouseEvent e){
		if(!click && getnbDegat() ==0 && !isMur()) 
			ResetColor();
		destination=null;
		
    }
    
    // la m�thode paintComponent g�re 
    // l'affichage de la case 
    public void paintComponent(Graphics g){
		// on affiche d'abord la case
	    super.paintComponent(g); 
		// puis on affiche la pi�ce 
		// � l'int�rieur
		// si la case contient une pi�ce
	   
	    if(this.getnbDegat()>0)
	    	{setBackground(Color.DARK_GRAY);}
		if(P!=null){
		    if(P.isBlue)
		    	g.setColor(Color.blue);
		    else
				g.setColor(Color.red);
		    Font f = new Font("Comic sans MS",Font.BOLD,20);
		    g.setFont(f);
		    g.drawString(P.ToString(),20,30);
		}
    }

	public boolean isDeploiement() {
		return deploiement;
	}

	public void setDeploiement(boolean deploiement) {
		this.deploiement = deploiement;
	}

	public int getnbDegat() {
		return nbDegat;
	}

	public void setnbDegat(int nbDegat) {
		this.nbDegat = nbDegat;
	    if(this.getnbDegat()>0){setBackground(Color.DARK_GRAY);}
	}

	public boolean isOccupee() {
		return occupee;
	}

	public void setOccupee(boolean occupee) {
		this.occupee = occupee;
	}
	public boolean isMur(){return Mur;}
	public void setMur() {
		Mur = true;
		this.setOccupee(true);
		setBackground(Color.BLACK);
	}
	public void majInfos(){
		plat.setPv(this.P.getVitalite());
		plat.setMouvement(this.P.getMouvement());
		plat.setForce(this.P.getForce());
		plat.setPrecision(this.P.getPrecision());
		plat.setSoin(this.P.getSoin());
		plat.setPortee(this.P.getPortee());
		plat.setResistance(this.P.getResistance());
	}
}	
